package l1j.server.server.clientpackets;

import java.util.logging.Logger;

import l1j.opqlo.Server.L1World.L1World;
import l1j.server.echo.ClientThread;
import l1j.server.server.datatables.lock.AccountReading;
import l1j.server.server.model.L1Clan;
import l1j.server.server.model.L1Object;
import l1j.server.server.model.Instance.L1NpcInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.serverpackets.S_RetrieveElfList;
import l1j.server.server.serverpackets.S_RetrieveList;
import l1j.server.server.serverpackets.S_RetrievePledgeList;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.serverpackets.S_SystemMessage;
import l1j.server.server.templates.L1Account;

/**
 * 要求變更與使用倉庫密碼
 *
 * @author dexc
 *
 */
public class C_WarePassword extends ClientBasePacket {

	private static final Logger _log = Logger.getLogger(C_WarePassword.class.getName());

	/*public C_Password() {
	}

	public C_Password(final byte[] abyte0, final ClientExecutor client) {
		super(abyte0);
		try {
			this.start(abyte0, client);

		} catch (final Exception e) {
			_log.error(e.getLocalizedMessage(), e);
		}
	}*/

	@Override
	public String getType() {
		return this.getClass().getSimpleName();
	}

	@Override
	public void start(final byte[] decrypt, final ClientThread client) {
		try {
			// 資料載入
			this.read(decrypt);
//
//			final int mode = this.readC();// 模式
//			int olepwd = this.readD();// 密碼
//			final int newpwd = this.readD();// 新密碼
//
//			if (olepwd < 0) {
//				olepwd = -256;
//			}
//			//_log.error("mode: " + mode);
//			//_log.error("olepwd: " + olepwd);
//			//_log.error("newpwd RO npcid: " + newpwd);//*/
//
//			final L1PcInstance pc = client.getActiveChar();
//
//			// 原始密碼
//			final int srcpwd = client.getAccount().get_warehouse();
//
//			final int tmpId = pc.getTempID();
//
//			if (olepwd != srcpwd) {
//				// 835 密碼錯誤。
//				pc.sendPackets(new S_ServerMessage(835));
//
//				final int error = client.get_error();
//				client.set_error(error + 1);
//				_log.log(Level.SEVERE ,pc.getName() + " 倉庫密碼輸入錯誤!!( " + client.get_error() + " 次)");
//				return;
//			}
//
//			boolean isRepas = false;
//			boolean isNpc = false;
//			L1Object obj = L1World.getInstance().findObject(newpwd);
//			if (obj == null) {
//				obj = L1World.getInstance().findObject(tmpId);
//				if (obj != null) {
//					isNpc = true;
//
//				} else {
//					isRepas = true;
//				}
//
//			} else {
//				isNpc = true;
//			}
//
//			if (isNpc) {
//				if (olepwd != -256) {
//					if (obj instanceof L1NpcInstance) {
//						L1NpcInstance npc = (L1NpcInstance) obj;
//						final int difflocx = Math.abs(pc.getX() - npc.getX());
//						final int difflocy = Math.abs(pc.getY() - npc.getY());
//						// 距離3格以上無效
//						if (difflocx > 3 || difflocy > 3) {
//							if (tmpId != 0) {
//								obj = L1World.getInstance().findObject(tmpId);
//								npc = (L1NpcInstance) obj;
//
//							} else {
//								// 消除
//								this.stopAction(client, pc);
//								return;
//							}
//						}
//						switch (npc.getNpcId()) {
//						case 60028:// 艾爾
//							if (pc.getLevel() >= 5) {
//								// 精靈倉庫取回
//								pc.sendPackets(new S_RetrieveElfList(newpwd, pc));
//							}
//							break;
//
//						default:// 一般倉庫取回
//							if (pc.getLevel() >= 5) {
//								switch (mode) {
//								case 1:// 個人
//									pc.sendPackets(new S_RetrieveList(newpwd, pc));
//									break;
//
//								case 2:// 血盟
//									pc.sendPackets(new S_RetrievePledgeList(newpwd, pc));
//									break;
//								}
//							}
//							break;
//						}
//					}
//
//				} else {
//					isRepas = true;
//				}
//			}
//
//			// 變更密碼
//			if (isRepas) {
//				// 新舊密碼相同
//				if (newpwd == srcpwd) {
//					// 342：你不能使用舊的密碼當作新的密碼。請再次輸入密碼。
//					pc.sendPackets(new S_ServerMessage(342));
//					// 消除
//					this.stopAction(client, pc);
//					return;
//				}
//
//				if (obj == null && newpwd < 1000000) {
//					// 新密碼小於7位數
//					// 變更密碼
//					final L1Account account = client.getAccount();
//					account.set_warehouse(newpwd);
//					AccountReading.get().updateWarehouse(account.get_login(), newpwd);
//				}
//			}
//
//			// 消除
//			this.stopAction(client, pc);
			
			L1PcInstance pc = client.getActiveChar();
			if (pc == null) {
				return;
			}
			
			// 類型(0: 密碼變更, 1: 一般倉庫, 2: 血盟倉庫)
			int type = readC();

			// 取得第一組數值(舊密碼, 或待驗證的密碼)
			int pass1 = readD();

			// 取得第二組數值(新密碼, 或倉庫 NPC 的 objId)
			int pass2 = readD();

			// 不明的2個位元組
			readH();

			// 取得角色物件
			L1Account account = client.getAccount();

			// 變更密碼
			if (type == 0) {
				// 兩次皆直接跳過密碼輸入
				if ((pass1 < 0) && (pass2 < 0)) {
					pc.sendPackets(new S_ServerMessage(L1SystemMessageId.$79));
				}

				// 進行新密碼的設定
				else if ((pass1 < 0) && (account.get_warehouse() == 0)) {
					// 進行密碼變更
					AccountReading.get().updateWarehouse(account.get_login() ,pass2);
					pc.sendPackets(new S_SystemMessage("倉庫密碼設定完成，請牢記您的新密碼。"));
				}

				// 進行密碼變更
				else if ((pass1 > 0) && (pass1 == account.get_warehouse())) {
					// 進行密碼變更
					if (pass1 == pass2) {
						// [342::你不能使用舊的密碼當作新的密碼。請再次輸入密碼。]
						pc.sendPackets(new S_ServerMessage(L1SystemMessageId.$342));
						return;
					} else if (pass2 > 0) {
						AccountReading.get().updateWarehouse(account.get_login() ,pass2);
						pc.sendPackets(new S_SystemMessage("倉庫密碼變更完成，請牢記您的新密碼。"));
					} else {
						AccountReading.get().updateWarehouse(account.get_login() ,0);
						pc.sendPackets(new S_SystemMessage("倉庫密碼取消完成。"));
					}
				} else {
					// 送出密碼錯誤的提示訊息[835:密碼錯誤。]
					pc.sendPackets(new S_ServerMessage(L1SystemMessageId.$835));
				}
			}

			// 密碼驗證
			else {
				if (Integer.valueOf(account.get_password()) == pass1) {
					int objid = pass2;
					L1Object obj = L1World.getInstance().findObject(objid);
					if (pc.getLevel() >= 5) {// 判斷玩家等級
						if (type == 1) {
							if (obj != null) {
								if (obj instanceof L1NpcInstance) {
									L1NpcInstance npc = (L1NpcInstance) obj;
									// 判斷npc所屬倉庫類別
									switch (npc.getNpcId()) {
									case 60028:// 倉庫-艾爾(妖森)
										// 密碼吻合 輸出倉庫視窗
										if (pc.isElf())// 判斷是否為妖精
											pc.sendPackets(new S_RetrieveElfList(
													objid, pc));
										break;
									default:
										// 密碼吻合 輸出倉庫視窗
										pc.sendPackets(new S_RetrieveList(objid, pc));
										break;
									}
								}
							}
						} else if (type == 2) {
							if (pc.getClanid() == 0) {
								// \f1若想使用血盟倉庫，必須加入血盟。
								pc.sendPackets(new S_ServerMessage(L1SystemMessageId.$208));
								return;
							}
							int rank = pc.getClanRank();
							if (rank == L1Clan.CLAN_RANK_PUBLIC) {
								// 只有收到稱謂的人才能使用血盟倉庫。
								pc.sendPackets(new S_ServerMessage(L1SystemMessageId.$728));
								return;
							}
							if ((rank != L1Clan.CLAN_RANK_PROBATION) && (rank != L1Clan.CLAN_RANK_GUARDIAN)
							  &&(rank != L1Clan.ALLIANCE_CLAN_RANK_ATTEND) && (rank != L1Clan.CLAN_RANK_PRINCE) 
							  &&(rank != L1Clan.CLAN_RANK_GUARDIAN) && (rank != L1Clan.ALLIANCE_CLAN_RANK_GUARDIAN) 
							  &&(rank != L1Clan.NORMAL_CLAN_RANK_PRINCE)) {
								// 只有收到稱謂的人才能使用血盟倉庫。
								pc.sendPackets(new S_ServerMessage(L1SystemMessageId.$728));
								return;
							}
							pc.sendPackets(new S_RetrievePledgeList(objid, pc));

						}
					}
				} else {
					// 送出密碼錯誤的提示訊息
					pc.sendPackets(new S_ServerMessage(835));
				}
			}
			

		} catch (final Exception e) {
			//_log.error(e.getLocalizedMessage(), e);

		} finally {
			this.over();
		}
	}

	private void stopAction(ClientThread client, L1PcInstance pc) {
		// 消除
		pc.setTempID(0);
		// 解除錯誤次數
		client.set_error(0);
	}
}